#include "iplineedit.h"
#include<QHBoxLayout>
#include<QSizePolicy>
#include<QLabel>
#include<QRegularExpression>//qt6新添加的
#include<QRegularExpressionValidator>
#include<QKeyEvent>
IPLineEdit::IPLineEdit(QWidget *parent)
    :QLineEdit(parent)
{
    QHBoxLayout *layout=new QHBoxLayout(this);
    layout->setContentsMargins(1,1,1,1);//问题点：设置布局页边距，设置布局内容区域于父容器边界之间的空白距离
    QLabel *labelDot[3];
    QRegularExpression regExp("25[0-5]|2[0-4][0-9]|1?[0-9]{1,2}");//ip地址的规则
    for(int i=0;i<IP_INPUT_SIZE;i++)
    {
        m_lineEidt[i]=new QLineEdit(this);

        //保存线条编辑是否使用边框绘制本身

        //m_lineEidt[i]->setFrame(false);
        m_lineEidt[i]->setProperty("ip",true);//使用css表
        //设置lineedit的长度
        m_lineEidt[i]->setMaxLength(3);
        //消除布局中的空隙，居中
        m_lineEidt[i]->setAlignment(Qt::AlignCenter);//问题点：输入框内的文本对齐为居中对齐
        //问题点：设置这个小控件的布局，输入款合适大小，不会随意变形，水平方向会拉伸填满空间，最值方向保存推荐高度，多余空间变成页边距
        m_lineEidt[i]->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);//定义控件在布局中的大小行为，第一个为水平方向的大小策略，第二个为垂直方向
        m_lineEidt[i]->setValidator(new QRegularExpressionValidator(regExp,this));//设置验证规则
        //通过按键控制光标移动，进行输入不同位置
        //对四个控件安装事件过滤
        m_lineEidt[i]->installEventFilter(this);
        layout->addWidget(m_lineEidt[i]);
        if(i<3)
            {
                labelDot[i]=new QLabel(".",this);
            labelDot[i]->setFixedWidth(2);
            layout->addWidget(labelDot[i]);
        }


    }
    m_lineEidt[0]->setFocus();
    m_lineEidt[0]->selectAll();//问题点：用户可以直接输入新文本来替换被选中的全部内容

}

IPLineEdit::~IPLineEdit()
{

}

int IPLineEdit::getIndex(QLineEdit *line)
{
    for(int i=0;i<IP_INPUT_SIZE;i++)
    {
        if(m_lineEidt[i]==line)
        {
            return i;
        }
    }
    return -1;
}

QString IPLineEdit::text()
{
    QString content ;
    for(int i=0;i<IP_INPUT_SIZE;i++)
    {
        content+=m_lineEidt[i]->text();
        if(i<3)
        {
            content+=".";
        }
    }
    return content;
}

bool IPLineEdit::eventFilter(QObject *obj, QEvent *event)
{
    if(children().contains(obj)&&QEvent::KeyPress==event->type())//判断语句不会
    {
        QKeyEvent*keyEvent=dynamic_cast<QKeyEvent*>(event);
        QLineEdit* pcurrentline=qobject_cast<QLineEdit*>(obj);
        switch(keyEvent->key())
        {
        case Qt::Key_0:
        case Qt::Key_1:
        case Qt::Key_2:
        case Qt::Key_3:
        case Qt::Key_4:
        case Qt::Key_5:
        case Qt::Key_6:
        case Qt::Key_7:
        case Qt::Key_8:
        case Qt::Key_9:
        {
            QString strText=pcurrentline->text();
            if(strText.length()<=3&&strText.toInt()*10>255)
            {
                int index=getIndex(pcurrentline);
                if(index>-1&&index!=3)
                {
                    m_lineEidt[index+1]->setFocus();
                    m_lineEidt[index+1]->selectAll();
                }
            }
             break;
        }
        case Qt::Key_Left:
        {
            QString strText=pcurrentline->text();
            if(pcurrentline->cursorPosition()==0)
            {
                int index=getIndex(pcurrentline);
                if(index>0)
                {
                    m_lineEidt[index-1]->setFocus();
                    m_lineEidt[index-1]->selectAll();
                }
            }
            break;
        }
        case Qt::Key_Right:
        {
            QString strText=pcurrentline->text();
            if(pcurrentline->cursorPosition()==strText.length())
            {
                int index=getIndex(pcurrentline);
                if(index>-1&&index!=3)
                {
                    m_lineEidt[index+1]->setFocus();
                    m_lineEidt[index+1]->selectAll();
                }
            }
            break;
        }
        case Qt::Key_Space:
        case Qt::Key_Period:
        {
            QString strText=pcurrentline->text();


                int index=getIndex(pcurrentline);
                if(index>-1&&index!=3)
                {
                    m_lineEidt[index+1]->setFocus();
                    m_lineEidt[index+1]->selectAll();
                }

        }

        }
    }
    return false;//事件继续传递给目标对象进行正常处理
}



QIconLineEdit::QIconLineEdit(QWidget *parent)
    :QLineEdit(parent)
{
    labelPixmap=new QLabel(this);
    labelPixmap->setMinimumSize(16,16);//设置label的大小
    labelPixmap->setVisible(false);//没放图标时不可见
}

QIconLineEdit::~QIconLineEdit()
{

}

void QIconLineEdit::SetIcon(const QPixmap &pixmap)
{   if (pixmap.isNull()) return;
    labelPixmap->setPixmap(pixmap);//插入图片到label
    labelPixmap->setVisible(true);//在输入框显示图片
    labelPixmap->setGeometry(5,(this->height()-pixmap.height())/2,16,16);//垂直居中图标顶部到容器顶部的距离 = 图标底部到容器底部的距离
    setTextMargins(25,1,1,1);//文本距离左边框25像素（为图标留空间）

}
